define宏定义和const定义常量区别

    由于需求不断的添加,工程越来越大,编译速度是越来越慢。之前就看过帖子:

使用宏定义过多的话,随着工程越来越大,编译速度会越来越慢。

    当时也想过替换成常量,但是当时的替换方法有问题,导致编译的时候有很多重复的变量,替换失败了,就不了了之,直到最近,每次编译的时间实在是超出了我的容忍极限,于是下定决心,一定要替换掉。又从网上查看帖子,从简书上看到了这篇文章【如何正确使用const,static,extern】|那些人追的干货

以下为一段替换后的代码:

1
2
3
4
static CGFloat const kHeaderImageWidth = 100; //Header宽度
static CGFloat const kHeaderImageHeight = 100; //Header宽度
static CGFloat const kHeaderImageY = 110;
static CGFloat const kPadding = 30;

const 是c++中的修饰符。 c++中常用来定义常量,修饰左值。

补充说明:以上的类型常量替换宏的情况,只是适用于单个文件的情况。如果是多个文件共享的常量,苹果推荐的这样的方式:

  • LJConstant.h
1
2
3
4
5
6
7
UIKIT_EXTERN CGFloat const LJFirstHeaderHeight; // 分组页面第一个分组的header高度

UIKIT_EXTERN CGFloat const LJOtherHeaderHeight; // 分组页面其它分组的header高度

UIKIT_EXTERN CGFloat const LJLastFooterHeight; // 分组页面最后一个分组的footer高度

UIKIT_EXTERN CGFloat const LJOtherFooterHeight; // 分组页面最后其它分组的footer高度
  • LJConstant.m
1
2
3
4
5
6
7
CGFloat const LJFirstHeaderHeight = 15.0f; // 分组页面第一个分组的header高度

CGFloat const LJOtherHeaderHeight = 20.0f; // 分区页面其它分组的header高度//20

CGFloat const LJLastFooterHeight = 15.0f; // 分组页面最后一个分组的footer高度

CGFloat const LJOtherFooterHeight = 0.1f; // 分组页面最后其它分组的footer高度

#define 宏定义语句, 在预处理阶段直接做文本替换,不做类型检查。

它们之间的最大区别:

1.对于const变量,系统只给了一个相应的内存地址,而#define则是给出了一个立即数。因为const变量是存放在内存的静态区域中,所以在程序运行过程中const变量只有一个拷贝,而#define所定义的宏变量却有多个拷贝,所以宏在程序运行过程中所消耗的内存要比const变量的大得多。#define所定义的宏变量在预编译的时候进行替换,const变量在编译时确定其值。const,enum变量进符号表,可在调试中查看变量的值.而#define不行。

2.const对数据进行类型检查。#define无需进行类型检查。定义宏参数时需将参数()起来。而且调用时参数不应在宏中再做运算。

3.除了定义常量外,const还有强大的修饰功能。#define能增加程序的可读性,有些复杂的功能只需一条宏显示。